﻿Public Class Query

    Private x_table As PO
    Private _whereClause As String
    Private _orderBy As String

    Private sql As String
    Private isCorrect As Boolean = True
    Private isOrderBy As Boolean = False
    Private erro As String


    '' Chú ý: mặc dù tham số của hàm khởi tạo new là một PO, ban đầu
    '' cảm tưởng PO chưa được gắn vào Table nào (chưa là X_Table)
    '' Nhưng vì khi tạo mới một PO thì bắt buộc phải tạo mới từ lớp X_Table
    '' nên PO coi như đã được load (load POInfo).
    '' x_table chỉ là thể hiện của một row trong table, nhưng mục đích truyển tham số
    '' x_table là để load thông tin cho POInfo-có đầy đủ các thông tin về table
    Public Sub New(ByVal x_table1 As PO, ByVal whereClause As String)
        Me.x_table = x_table1
        If (whereClause Is Nothing) Then
            Me._whereClause = whereClause
        Else
            Me._whereClause = Trim(whereClause) ''Xóa khoảng trắng ở hai đầu where clause
        End If

    End Sub

    ''' <summary>
    ''' Hàm này bị sai, chỉ đúng với những câu lệnh sqlWhere cho ra 1 kết quả
    ''' </summary>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Public Function list() As List(Of PO)
        Me.buildSql()

        If (Not Me.isCorrect) Then
            MessageBox.Show(erro)
            Return Nothing
        End If

        Dim myConnect As MySqlConnect
        myConnect = New MySqlConnect

        Dim da As DataTable
        da = myConnect.executeQuery(Me.sql)
        If (da.Rows.Count = 0) Then
            Return Nothing
        End If

        Dim lst As List(Of PO)
        lst = New List(Of PO)

        Dim i As Integer = 0
        Dim id As Integer

        For i = 0 To da.Rows.Count - 1
            id = da.Rows(i)(0)
            Me.x_table.load(id)
            lst.Add(x_table)
        Next

        Return lst
    End Function

    Public Function dataTable() As DataTable
        Me.buildSql()

        If (Not Me.isCorrect) Then
            MessageBox.Show(erro)
            Return Nothing
        End If

        Dim myConnect As MySqlConnect
        myConnect = New MySqlConnect

        Dim da As DataTable
        da = myConnect.executeQuery(Me.sql)
        If (da.Rows.Count = 0) Then
            Return Nothing
        End If
        Return da
    End Function

    Public Function setOrderBy(ByVal columnName As String) As Boolean
        'Kiểm tra str có là một column của Table hay không?
        Dim i As Integer
        Dim b As Boolean = False
        For i = 0 To Me.x_table.getPoInfo.columnCount - 1
            If (columnName.Equals(Me.x_table.getPoInfo.getPOInfoColumn(i).getColumnName)) Then
                b = True
                Exit For
            End If

        Next
        If (b) Then
            Me._orderBy = columnName
            Me.isOrderBy = True
        Else
            Me.isCorrect = False
            Me.erro = "ERRO! " & columnName & " is not a column of " & Me.x_table.getPoInfo.TableName & ""
        End If

    End Function

    Public Function buildSql() As Boolean
        '' Kiểm tra mệnh đề where có đúng cú pháp hay không
        Dim sqlBuffer As String
        sqlBuffer = "SELECT * FROM " & Me.x_table.getPoInfo.TableName & ""
        If (Not Me._whereClause Is Nothing) Then
            sqlBuffer += " WHERE " & Me._whereClause & ""
        End If

        If (Me.isOrderBy) Then
            sqlBuffer += " ORDER BY " & Me._orderBy & ""
        End If
        Me.sql = sqlBuffer
    End Function
End Class
